require(GGally, quietly = TRUE)
require(reshape2, quietly = TRUE)
library(tidyverse, warn.conflicts = F)
library(rvest)
library(plotly)
library(cluster)
library(ggdendro)
library(ggfortify)
library(broom)

Analisando os dados das unidades acadêmicas da UFCG(nossa querida universidade)

Introdução aos dados

Para realizar minha análise usarei os dados obtidos a partir do portal de transparência do governo federal, onde análisarei as seguintes variáveis de cada Unidade acadêmica da UFCG: o número de funcionários na Unidade acadêmica que não são professores(outros), o número de professores com carga horária 20h/semanal na UA, o número de professores com carga horária 40h/semanal na UA e idade mediana dos funcionarios no cargo, dando uma olhada nos dados temos:

dados <- read.csv("ufcg-201704-sumario-UAs-wide.csv")
dados_filtrados <- dados %>% select(-idade_25perc, -idade_75perc)
names(dados_filtrados) <- c("Unidade_Academica","Numero_Funcionarios","Numero_Professor_20h","Numero_Professor_40h","Idade_Mediana_Cargo")

dados_filtrados %>%
  select(-Unidade_Academica) %>%  
  ggpairs()

Observando os dados acima vemos que eles estão bem dispersos, apesar de existir uma correlação razoável entre idade mediana e o número de funcionarios ela não é forte o suficiente para justificar um associação entre essas variáveis.

Definindo o número de grupos dos dados

Para categorizar as nossas queridas Unidades Academicas, vamos usar o k-means(conhecido algoritmo para mineração de dados) para particionar os dados em grupos e observar as caracteristicas de cada grupo, para tanto devemos decidir o número de grupos que serão criados, assim podemos usar uma medida comumente usada no k-means para decidir um bom valor para o número de grupos, para tanto calcularemos a distância do centro de cada cluster para o centro dos dados e multiplicamos pelo número de pontos nesse cluster. Somando esse valor para todos os clusters, temos betweenss abaixo. Se esse valor for próximo do somatório total das distâncias dos pontos para o centro dos dados (totss), os pontos estão próximos do centro de seu cluster, essa proporção pode ser usada para definir um bom valor de número de grupos. Quando ela para de crescer, para de valer a pena aumentar o número de grupos.

set.seed(123)
explorando_k = tibble(k = 1:15) %>% 
    group_by(k) %>% 
    do(
        kmeans(select(dados_filtrados, -Unidade_Academica), 
               centers = .$k, 
               nstart = 20) %>% glance()
    )

explorando_k %>% 
    ggplot(aes(x = k, y = betweenss / totss)) +
    labs(x = "Número de Grupos") +  
    geom_line() + 
    geom_point()

Olhando o gráfico acima parece que o gráfico começa a parar de crescer quando o número de grupos está perto de 6, então esse parece ser um bom número de grupos para os dados.

Categorizando as Unidades Acadêmicas da UFCG

Gráfico dos grupos

Assim utilizando o K-means e separando os dados em 6 grupos, temos os grupos abaixo:

set.seed(123)
km = dados_filtrados  %>% 
    select(-Unidade_Academica) %>% 
    kmeans(centers = 6, nstart = 20)

dados_scaled = km %>% 
    augment(dados_filtrados) %>% # Adiciona o resultado de km 
                            # aos dados originais dw2.scaled em 
                            # uma variável chamada .cluster
    gather(key = "variavel", 
           value = "valor", 
           -Unidade_Academica, -.cluster) # = move para long todas as 
                                            # variávies menos repository_language 
                                            # e .cluster

plot_grupos_unidades <- dados_scaled %>% 
                        ggplot(aes(x = variavel, y = valor, group = Unidade_Academica, colour = .cluster)) + 
                        geom_line(alpha = .5) + 
                        facet_grid(.cluster~.)

plot_grupos_unidades

Gráfico interativo dos grupos

Para uma Visualização mais interativa(com os nomes das Unidades Academicas), temos o gráfico abaixo:

ggplotly(plot_grupos_unidades)

Categorias das Unidades

Podemos categorizar esse grupos da seguinte forma:

  1. Grupo(vermelho) das unidades Promissoras, são unidades que tem uma idade mediana de servidores nos cargos razoavél, tem poucos funcionários, muito poucos professores de 20h e muitos professores 40h, logo elas são promissoras pois tendem a crescer bem(matendo nivel de professores com dedicação exclusiva com o passar da idade).
  2. Grupo(Amarelo) das Engenharias, unidades que tem servidores com mais tempo em seus cargos, que tem bastante funcionários, poucos professores 20h e muitos professores 40h, são unidades(curiosamente essas unidades são de dois cursos de engenharia) já amadurecidas que tem muitos Professores de 40h e funcionários.
  3. Grupo(Verde) das unidades Amadurecidas, unidades com servidores com um bom tempo de cargo, tem um número razoavel de funcionários, tem poucos professores de 20h e tem um número razoavél de professores 40h, são unidades já amadurecidas que tem números paroximadament parcidos de professores 40h e funcionários.
  4. Grupo(Azul claro) das unidades Jovens mas dedicadas, são unidades que os servidores tem pouco tempo de trabalho, tem poucos funcionários, poucos professores 20h e muitos professores de dedicação exclusiva ou 40h, ou seja os funcionarios tm pouco tempo de cargo mais são em maioria professores com dedicação exclusivas ou 40h.
  5. Grupo(Azul) dos Jovens sem exclusividade, unidades com servidores com pouco tempo de cargo, tem poucos funcionários, tem muitos professores 20h(provalmente pelo fato de serem mais baratos e cobrirem melhor a falta de professores qualificicados nessas áreas) e tem número razoável de professores 40h, são unidades(curiosamente essas unidades são de dois cursos da área das ciências médicas) que tem poucos professores com dedicação exclusiva com relação aos professores de 20h.
  6. Grupo(Rosa) das unidades Jovens e pequenas, são unidades com poucos funcionários, poucos professores 20h e 40h e com servidores que tem pouco tempo de trabalho em seus cargos, ou seja são unidades com poquissimos servidores e os mesmos tem pouco tempo de trabalho.